﻿#ifndef TODOLIST_H
#define TODOLIST_H

#include "Defines.h"
#include "PA.h"

//声明一个名称为Ui的命名空间，该空间包含类TodoList
namespace Ui
{
    class TodoList;
}

class TodoList : public QMainWindow
{
    Q_OBJECT

public:
    // explicit 禁止编译器执行非预期 (往往也不被期望) 的类型转换,构造函数被explicit修饰后, 就不能再被隐式调用
    explicit TodoList(QWidget* parent = nullptr);
    ~TodoList();
    //绘画事件
    //在程序开始运行时就会自动发送重绘事件而调用paintEvent()函数
    //改变窗口大小、移动窗口、手动调用update、repaint等时候自动调用paintEvent
    //基本上对窗口做的任何操作，都会调用的
    void paintEvent(QPaintEvent*);
private slots:
    //槽函数
    void on_addTodo_clicked();
    void timerUpDate();
    void on_horizontalSlider_sliderMoved(int position);
    void on_confirmButton_clicked();

private:
    //界面类型
    enum WINSTATE
    {
        LIST,
        EDIT,
        DETAIL
    };
    //显示列表的类型
    enum VIEWSTATE
    {
        ALL,
        UNDONE,
        WARN
    };

    bool ValidIndex();                     //当前所选项目可用
    void HideWindows(bool hidden);         //隐藏编辑界面
    void ChangeState(WINSTATE state);      //更改界面
    void MoveIndex(int id, int x);         //滑动选项（动画）
    void StartAniTimer();                  //开始动画
    void StopAniTimer();                   //结束动画
    void SetWarnText(int position);        //设置提醒计算
    void mousePressEvent(QMouseEvent*);    //鼠标按压事件
    void mouseMoveEvent(QMouseEvent*);     //鼠标移动时事件
    void mouseReleaseEvent(QMouseEvent*);  //鼠标释放事件
    void wheelEvent(QWheelEvent*);         //鼠标滚轮旋转事件

private:
    Ui::TodoList* ui = nullptr;
    QTimer* aniTimer;
    QPixmap boxes[4];                           //四张背景图片
    QPixmap checkPic, line, circle, selectBox;  //装饰图片
    WINSTATE state;                             //界面类型 LIST,EDIT, DETAIL
    VIEWSTATE viewState;                        //显示列表的类型 ALL, UNDONE, WARN
    PA pa;                                      // PA类
    Date viewDate;                              //当前显示项目的时间段

    //各个项目的参数
    int indexID[128];
    int indexPosX[128];
    int indexSize;
    int selectIndex;
    int deleteIndex;
    bool haveTodo;
    int paintY;

    //鼠标事件
    bool mouseList[64];
    int mouseCount;
    int mouseTime;
    int selectID;
    int pressX;
    int pressY;
    bool mousePre;

    //动画参数
    int waitTime;
    int warnAniTime;
    int moveY;
    int oldMoveY;
    int oldMoveX;
    int lastDateY;
    const int maxMoveAniFrame = 60;  // C++11 allowed
    const double maxMoveAniAngle = acos(-1) / 180.0 * 120;
    int moveAniFrame;
    int moveAniTarget;
    int moveAniSource;
    double moveAniA;  //正弦函数幅度

    //字体
    QFont font, sFont, dateFont;
};

#endif  // TODOLIST_H
